package com.pay.order.service.impl;

import com.pay.common.result.Result;
import com.pay.order.dto.OrderCreateRequest;
import com.pay.order.dto.OrderCreateResponse;
import com.pay.order.service.OrderService;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Slf4j
@Service
@DubboService
public class OrderServiceImpl implements OrderService {
    
    // 模拟订单存储，实际项目中应该使用数据库
    private static final Map<String, OrderCreateResponse> orderStore = new ConcurrentHashMap<>();
    
    @Override
    @Transactional
    public Result<OrderCreateResponse> createOrder(OrderCreateRequest request) {
        log.info("创建订单，请求参数：{}", request);
        
        try {
            // 1. 参数校验
            if (request.getAmount() == null || request.getAmount().compareTo(BigDecimal.ZERO) <= 0) {
                return Result.error("订单金额不能为空或小于等于0");
            }
            if (request.getMerchantId() == null || request.getMerchantId().trim().isEmpty()) {
                return Result.error("商户ID不能为空");
            }
            
            // 2. 风控检查（这里简化处理，实际应该调用风控服务）
            if (request.getAmount().compareTo(new BigDecimal("100000")) > 0) {
                return Result.error("订单金额超过风控限制");
            }
            
            // 3. 生成订单号
            String orderNo = generateOrderNo();
            
            // 4. 保存订单信息
            OrderCreateResponse response = new OrderCreateResponse();
            response.setOrderNo(orderNo);
            response.setAmount(request.getAmount());
            response.setStatus("PENDING");
            response.setPayUrl("/pay/" + orderNo);
            
            // 模拟保存到数据库
            orderStore.put(orderNo, response);
            
            // 5. 发送订单创建事件（这里简化处理，实际应该发送Kafka消息）
            log.info("订单创建成功，订单号：{}", orderNo);
            
            return Result.success(response);
            
        } catch (Exception e) {
            log.error("创建订单失败", e);
            return Result.error("创建订单失败：" + e.getMessage());
        }
    }
    
    @Override
    public Result<OrderCreateResponse> getOrder(String orderNo) {
        log.info("查询订单，订单号：{}", orderNo);
        
        try {
            // 参数校验
            if (orderNo == null || orderNo.trim().isEmpty()) {
                return Result.error("订单号不能为空");
            }
            
            // 查询订单（模拟从数据库查询）
            OrderCreateResponse order = orderStore.get(orderNo);
            if (order == null) {
                return Result.error("订单不存在");
            }
            
            return Result.success(order);
            
        } catch (Exception e) {
            log.error("查询订单失败", e);
            return Result.error("查询订单失败：" + e.getMessage());
        }
    }
    
    @Override
    @Transactional
    public Result<Void> cancelOrder(String orderNo) {
        log.info("取消订单，订单号：{}", orderNo);
        
        try {
            // 参数校验
            if (orderNo == null || orderNo.trim().isEmpty()) {
                return Result.error("订单号不能为空");
            }
            
            // 查询订单
            OrderCreateResponse order = orderStore.get(orderNo);
            if (order == null) {
                return Result.error("订单不存在");
            }
            
            // 检查订单状态
            if ("PAID".equals(order.getStatus())) {
                return Result.error("已支付的订单不能取消");
            }
            if ("CANCELLED".equals(order.getStatus())) {
                return Result.error("订单已经取消");
            }
            
            // 更新订单状态
            order.setStatus("CANCELLED");
            orderStore.put(orderNo, order);
            
            log.info("订单取消成功，订单号：{}", orderNo);
            return Result.success();
            
        } catch (Exception e) {
            log.error("取消订单失败", e);
            return Result.error("取消订单失败：" + e.getMessage());
        }
    }
    
    /**
     * 生成订单号
     */
    private String generateOrderNo() {
        return "ORD" + System.currentTimeMillis() + String.format("%04d", (int)(Math.random() * 10000));
    }
}
